package com.chenhs.oop.study.集合;

/**
 * @program: JAVA300
 * @description: 自己实现ArrayList
 * @author: peanut
 * @create: 2019-02-22 23:31
 */
public class 自定义ArrayList {


    /* 定义一个数组*/
    private Object[] elementDate;
    /* 定义一个集合的下标*/
    private int saie;
    /* 定义数组的默认长度*/
    private static final int LANG = 10;

    /* 重写构造方法*/
    public 自定义ArrayList() {
        elementDate = new Object[LANG];
    }

    /* 用户自定义长度的构造方法*/
    public 自定义ArrayList(int lang) {
        elementDate = new Object[lang];
    }

    public static void main(String[] args) {
        自定义ArrayList list = new 自定义ArrayList(2);
        list.add("第一个元素");
        list.add("AA");
        list.add("第二个元素");
        list.add("第三个元素");
        System.out.println( list.toString());
        list.remove("AA");
        System.out.println( list.toString());
      /*  String s = list.toString();
        System.out.println(s);
        list.set("修改后", 1);
        String s1 = list.toString();
        System.out.println(s1);
        System.out.println(list.get(1));*/


    }

    /* 实现add方法*/
    public void add(Object a) {
        //当数组装满时给数组扩容。
        if (saie == elementDate.length) {
            Object[] newArray = new Object[elementDate.length + (elementDate.length >> 1)];
            /* 将 elementDate集合中的元素从0下标开始拷贝，拷贝到newArray数组中从0下标开始插入，一共拷贝elementDate.length个*/
            System.arraycopy(elementDate, 0, newArray, 0, elementDate.length);
            /* newArray的内存地址值直接赋值给elementDate，怕迫使elementDate所占用的资源被gc回收。*/
            elementDate = newArray;
        }
        /* saie的初始值为0所以下一元素的下标应为所以size自增一*/
        elementDate[saie++] = a;
    }

    /* get方法*/
    public Object get(int index) {
        if (index <= elementDate.length) {
            return elementDate[index];
        }
        return null;
    }

    /* 实现set方法*/
    public void set(Object element, int index) {
        elementDate[index] = element;

    }

    /*  重写toString方法用于打印集合中的元素*/
    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("[");
        for (Object o : elementDate) {
            if (o != "" && o != null) {
                sb.append(o + ",");
            }
        }
        sb.setCharAt(sb.length() - 1, ']');
        return sb.toString();
    }

    /* 按元素移除*/
    public void remove(Object object) {
        for (int i = 0; i < elementDate.length; i++) {
            if (elementDate[i].equals(object)) {
                remove(i);
                break;
            }
        }
    }

    /* 按下标移除*/
    public void remove(int index) {
//        System.out.println(index+":"+saie);
        /* 先判断下标是否越界*/
        if (-1 < index && index < elementDate.length) {
            int number = elementDate.length-index-1;
            /* 将 elementDate集合中的元素从0下标开始拷贝，拷贝到newArray数组中从0下标开始插入，一共拷贝elementDate.length个*/
            System.arraycopy(elementDate, index + 1, elementDate, index,number);
            elementDate[--saie]=null;
        }else {
            new RuntimeException("数组下标越界，请输入0到"+(elementDate.length-1)+"的范围内的数字。");
        }

    }
}
